"""
专门用于封装主页数据统计接口视图的
"""

from django.utils import timezone
from rest_framework.views import APIView
from rest_framework.response import Response
from users.models import User
from orders.models import OrderInfo

# 统计用户总量
class UserTotalCountView(APIView):

    def get(self, request):
        # 1、聚合统计出用户数量
        count = User.objects.count()

        # localtime函数返回当前django配置文件指定时区的当前时刻
        # cur_date是一个datetime时间点对象，包含年月日时分秒属性
        cur_date = timezone.localtime()
        # 2、构建响应返回
        return Response({
            'count': count,
            'date': cur_date.today() # 获取一个只包含年月日时间date对象
        })

# 日增用户统计
class UserDayCountView(APIView):

    def get(self, request):
        # 1、获取当日(配置文件中指定时区的当日)的零时刻
        # cur_time是一个datetime对象（2021-3-22 16:54:30 Asia/Shanghai）
        cur_time = timezone.localtime()
        # cur_0_time也是一个datetime对象，通过replace把时分秒设置为0(2021-3-22 0:0:0 Asia/Shanghai)
        cur_0_time = cur_time.replace(hour=0, minute=0, second=0)

        # 2、过滤当日新建用户数量
        count = User.objects.filter(date_joined__gte=cur_0_time).count()

        return Response({
            'count': count,
            'date': cur_0_time.date()
        })


# 日活跃用户统计
class UserActiveCountView(APIView):

    def get(self, request):
        # 1、获取当日(配置文件中指定时区的当日)的零时刻
        # cur_time是一个datetime对象（2021-3-22 16:54:30 Asia/Shanghai）
        cur_time = timezone.localtime()
        # cur_0_time也是一个datetime对象，通过replace把时分秒设置为0(2021-3-22 0:0:0 Asia/Shanghai)
        cur_0_time = cur_time.replace(hour=0, minute=0, second=0)

        # 2、过滤当日登陆的用户数量
        count = User.objects.filter(last_login__gte=cur_0_time).count()

        return Response({'count': count, 'date': cur_0_time.date()})


# 日下单用户数量统计
class UserOrderCountView(APIView):

    def get(self, request):
        cur_time = timezone.localtime()
        cur_0_time = cur_time.replace(hour=0, minute=0, second=0)

        # 需求：当日，下了的所有订单，对应的用户的数量；
        # 分析：
        # (1)、已知条件(从表) —— 当日的零时刻；
        # (2)、目标数据(主表) —— 用户数量；
        # 结论：依据从表的已知条件，查询主表目标数据；

        # ============方案一：从从表入手查询=========
        # 1、根据已知条件查询当日的所有的订单
        # orders = OrderInfo.objects.filter(
        #     create_time__gte=cur_0_time
        # )

        # 2、提取下单用户
        # user_set = set()
        # for order in orders:
            # order是每一个OrderInfo对象
            # order.user是当前订单下单的用户
        #     user_set.add(order.user) # 把当前订单的下单用户添加到集合中(自动去重)
        #
        # count = len(user_set)

        # ============方案二：从主表入手查询=========
        # 在django中，通过特殊的语法，实现了直接主表入手，从表已知条件查询主表目标数据
        # 默认不会去重
        user_queryset = User.objects.filter(
            # 这里表示的是orders是从表的意思
            # create_time是从表OrderInfo的过滤字段
            orders__create_time__gte=cur_0_time
        )
        user_set = set(user_queryset)
        count = len(user_set)

        return Response({
            'count': count,
            'date': cur_0_time.date()
        })


from datetime import timedelta
# 月增用户统计
class UserMonthCountView(APIView):

    def get(self, request):
        # 某一天新增用户过滤逻辑：大雨等于那一天的零时刻，小于次日零时刻
        # 1、最后一天即当日零时刻
        # datetime对象表示一个时间点
        end_0_time = timezone.localtime().replace(hour=0, minute=0, second=0)
        # 2、获取启始那一天的零时刻：启时间 = 结束时间 - (统计天数-1)
        # timedelta(days=29) --> 是一个时间段对象表示29天，可以和一个datetime时间点对象进行加减运算
        start_0_time = end_0_time - timedelta(days=29)
        # 3、遍历出每一天的零时刻
        ret_list = []
        for offset in range(30):
            # calc_0_time用于记录遍历出来的某一天的0时刻
            # calc_0_time = start_0_time + timedelta(days=0)   offset=0
            # calc_0_time = start_0_time + timedelta(days=1)   offset=1
            # calc_0_time = start_0_time + timedelta(days=2)   offset=2
            # ....
            # calc_0_time = start_0_time + timedelta(days=29)  offset=29
            # 公式：
            calc_0_time = start_0_time + timedelta(days=offset)
            next_0_time = calc_0_time + timedelta(days=1) # 次日零时刻
            count = User.objects.filter(
                date_joined__gte=calc_0_time,
                date_joined__lt=next_0_time
            ).count()
            ret_list.append({
                'count': count,
                'date': calc_0_time.date()
            })

        return Response(ret_list)


# 日分类商品访问量
from rest_framework.generics import ListAPIView
from goods.models import GoodsVisitCount
from meiduo_admin.serializers.home_serializers import *
class GoodsDayView(ListAPIView):
    queryset = GoodsVisitCount.objects.all() # 默认返回所有对象，但是我们需要过滤
    serializer_class = GoodsVisitCountModelSerializer

    def get_queryset(self):
        # 重写该方法，实现过滤
        cur_0_time = timezone.localtime().replace(hour=0, second=0, minute=0)
        return self.queryset.filter(
            create_time__gte=cur_0_time
        )














